#include "EpilBlockStatementInterpreter.h"
#include "EpilInterpreterException.h"
#include "EpilInterpreter.h"
#include "EpilChunkInterpreter.h"


EpilBlockStatementInterpreter::EpilBlockStatementInterpreter( EpilInterpreter * interpreter )
: EpilInterpreterBase( interpreter )
, m_exitReason( ECER_Normal )
, m_exitLocation( EpilLexLocation::InvalidLocation )
{
}


void EpilBlockStatementInterpreter::Run( const EpilBlockStatementCode * code )
{
	this->GetInterpreter()->EnterScope();

	try
	{
		EpilChunkInterpreter ci( this->GetInterpreter() );
		ci.Run( code->GetChunk() );
		m_exitReason = ci.GetExitReason();
		m_exitLocation = ci.GetExitLocation();
	}
	catch( ... )
	{
		this->GetInterpreter()->LeaveScope();
		throw;
	}

	this->GetInterpreter()->LeaveScope();
}